<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>
// 'use strict';

// Object的静态方法：

var obj1 = {
    name: '张三',
    age: 23,
    sex: '女'
}

// defineProperty用于定义对象的属性(属性/值/属性描述符)
// Object.defineProperty(obj,property,descriptor)
// obj 要定义属性的对象
// property 要定义的属性名
// descriptor 属性描述符(属性描述对象)

/* // 修改obj1对象的sex属性相关特性
Object.defineProperty(obj1,'sex',{// 属性描述对象
    configurable: true,// 是否可以配置(影响对象的sex属性是否可删除)
    enumerable: true,// 是否可枚举(影响对象的sex属性是否可以遍历)
    writable: true,// 是否可读写(影响对象的sex属性是否可读可修改)
    value: '男'// 对象sex的属性值
}); */

// delete obj1.sex;// 删除对象的sex属性
// console.log( obj1.sex );// undefined  '女'

// for (var key in obj1){
//     console.log( key );// 'name'  'age'
// }

// obj1.sex = '男';// 修改属性
// console.log( obj1.sex );// 读取属性

// console.log( obj1.sex );// '男'


var obj1 = {
    name: '张三',
    age: 23,
    sex: '女'
}
// 对象的属性访问器: setter 和 getter
// set()方法用于设置对象的属性值
    // 当我们修改对象的属性值时，自动触发set函数
// get()方法用于获取对象的属性值
    // 当我们访问对象的属性时，自动触发get函数
// 注意：set和get 不能与 writable和value 同时存在！

// 修改obj1对象的sex属性相关特性
Object.defineProperty(obj1,'sex',{// 属性描述对象
    configurable: true,// 是否可以配置(影响对象的sex属性是否可删除)
    enumerable: true,// 是否可枚举(影响对象的sex属性是否可以遍历)
    // writable: true,// 是否可读写(影响对象的sex属性是否可读可修改)
    // value: '妖'// 对象sex的属性值

    // get: function (){},
    // get(){}, 是上面写法的简写

    get(){// getter
        // console.log( this );// obj1
        console.log( 'getter被调用。。。' );
        // 对象的sex属性值，取决于get函数的返回值

        // return '妖';
        // return this.sex;// 会导致无限循环执行get方法
        return this._sex;// this._sex相当于一个中间变量
    },
    set(val){// setter
        // console.log( this );// obj1
        console.log( 'setter被调用。。。' );
        // 修改对象的sex属性值时，set被调用
        console.log( val );// '男' 新的值被作为参数传入到函数中

        // this.sex = val;// 会导致无限循环执行set方法
        this._sex = val;// this._sex相当于一个中间变量
    }
});
obj1.sex = '男';// 会触发set函数，并将'男'被传入到set函数中
console.log( obj1.sex );// '男' 会触发get函数，属性值取决于get的返回值

</script>
</body>
</html>